import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import com.ckjw.gobang.connect.Message;
import com.ckjw.gobang.connect.MessageType;
import com.ckjw.gobang.connect.User;
import com.ckjw.gobang.jdbc.DataBaseControl;

/*** 
*
*记录连接服务器用户的所有线程
*
* @author  李传开 戴俊伟
* @Date    Jun 13, 2022
 */
public class ManageClientThreads {
    private static HashMap<String, ServerConnectClientThread> hm = new HashMap<>();


    //返回 hm
    public static HashMap<String, ServerConnectClientThread> getHm() {
        return hm;
    }

    //添加线程对象到 hm 集合
    public static void addClientThread(String userId, ServerConnectClientThread serverConnectClientThread) {

        hm.put(userId, serverConnectClientThread);

    }
    
    //根据userId 返回ServerConnectClientThread线程
    public static ServerConnectClientThread getServerConnectClientThread(String userId) {
        return hm.get(userId);
    }

    //增加一个方法，从集合中，移除某个线程对象
    public static void removeServerConnectClientThread(String userId) {
        hm.remove(userId);
    }

    /**
     *返回所有在线用户的对象
     */
    public static String getOnlineUser() {
        ArrayList<User> onlineusers;
        String content="";
        onlineusers=DataBaseControl.getonlineuser(hm.keySet());//根据id集合返回所有此id用户
        for (User onlinuser : onlineusers) {
            
            content =content+ onlinuser.getUserId()+" "+onlinuser.getName()+"\n";//一行存储一个用户id和姓名
        }
    return content; 
}
    /**
     * 给所有客户端返回所有在线用户messege对象信息，即让客户端刷新在线用户
     */
    public static void refresh()
    {
         //创建发送在线用户列表的消息，然后返回给所有客户端
         String onlineUser = ManageClientThreads.getOnlineUser(); //获取所有在线用户封装到messege cotent里
         //返回message
         //构建一个Message 对象，返回给客户端
         Message message2 = new Message();
         message2.setMesType(MessageType.MESSAGE_RET_ONLINE_FRIEND);
         message2.setContent(onlineUser);
         //遍历所有在线客户端，发送好友列表的信息
         Iterator<String> iterator =ManageClientThreads.getHm().keySet().iterator();
         while (iterator.hasNext()) {
            Socket tmp= ManageClientThreads.getHm().get(iterator.next().toString()).getSocket();
            ObjectOutputStream oos;
            try {
                oos = new ObjectOutputStream(tmp.getOutputStream());
                oos.writeObject(message2);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
         }
    }
}
